package main

import (
	"fmt"
	"testing"
)

// 我们要测试下面这个简单的函数——返回最小值。
// 一般地，需要被测试的代码应该在类似于 intutils.go 的文件下，
// 其对应的测试文件应该被命名为 intutils_test.go
func IntMin(a, b int) int {
	if a < b {
		return a
	}
	return b
}

// t.Error* 会报告测试失败的信息，然后继续运行测试。
// t.Fatal* 会报告测试失败的信息，然后立即终止测试
func TestIntMinBasic(t *testing.T) {
	ans := IntMin(2, -2)
	if ans != -2 {
		t.Errorf("IntMin(2,-2) = %d;want -2", ans)
	}
}

func TestIntMinTableDriven(t *testing.T) {
	var tests = []struct {
		a, b int
		want int
	}{
		{0, 1, 0},
		{1, 0, 0},
		{2, -2, -2},
		{0, -1, -1},
		{-1, 0, -1},
	}

	for _, tt := range tests {
		testname := fmt.Sprintf("%d,%d", tt.a, tt.b)
		t.Run(testname, func(t *testing.T) {
			ans := IntMin(tt.a, tt.b)
			if ans != tt.want {
				t.Errorf("got %d ,want %d", ans, tt.want)
			}
		})
	}
}

// 基准测试通常在”_test.go”文件中，并以 Benchmark 开头命名。
// testing 运行器多次执行每个基准测试函数，并在每次运行时增加 b.N
// 直到它收集到精确的测量值。
// 通常，基准测试运行一个函数，我们在一个 b.N 次的循环内进行基准测试。
func BenchmarkIntMin(b *testing.B) {
	for i := 0; i < b.N; i++ {
		IntMin(1, 2)
	}
}

func main() {
	fmt.Println("start...")
}
